﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ChainAnalises.Classes.DivizionToAccords;
using ChainAnalises.Classes.IntervalAnalysis;
using Segmentator.Interfaces;

namespace Segmentator.Dividers
{
    /// <summary>
    /// Описывает любой алгоритм сегментации символьных последовательностей
    /// </summary>
    abstract class Algorithm
    {
        public static readonly string THEORETICAL_VOLUME = "Теоритический объем алфавита";
        public static readonly string PRACTICAL_VOLUME = "Практический объем алфавита";
        public static readonly string ENTROPY_IN = "Энтропия исходной цепи H:";
        public static readonly string AMOUNT_OF_INFORMATION_IN = "Количество информации исходной цепи H*n:";
        public static readonly string REMOTENESS_IN = "Удаленность исходной цепи g:";
        public static readonly string REGULARITY_IN = "Регулярность исходной цепи r:";
        public static readonly string GAMUT_IN = "Глубина исходной цепи G:";


        public static readonly string ENTROPY_OUT = "Энтропия просегментированной цепи H:";
        public static readonly string AMOUNT_OF_INFORMATION_OUT = "Количество информации просегментированной цепи H*n:";
        public static readonly string REMOTENESS_OUT = "Удаленность просегментированной цепи g:";
        public static readonly string REGULARITY_OUT = "Регулярность просегментированной цепи r:";
        public static readonly string GAMUT_OUT = "Глубина просегментированной цепи G:";

        public static readonly string BALANCE = "Баланс";
        public static readonly string THRESHOLD_LEFT = "Левый порог";
        public static readonly string THRESHOLD_RIGHT = "Правый порог";
        public static readonly string THRESHOLD = "Найденный порог";
        public static readonly string STEP_THRESHOLD = "Шаг изменения порога";
        public static readonly string START_LENGTH_WINDOW = "Начальная длина окна";
        public static readonly string PRECISION = "Точность";
        public static readonly string AMOUNT_START_ALGORITHM = "Количество запусков алгоритма";
        public static readonly string CHAIN_NAME = "Название цепи";
        public static readonly string SEQUENCE = "Символьная последовательность";
        public static readonly string MIN_ALPHABET_DISTORTION = "Минимальное расхождение алфавитов";
        

        protected InputData Data = new InputData();
        protected AlphabetChain Alphabet;
        protected Chain ConvolutedChain;
        protected double Threshold;

        public static LinkUp _linkUp = LinkUp.Start;
        protected bool DataLoaded = false; //Флаг отвечающий за загрузку данных для обработки

        /// <summary>
        /// Загружает данные для обработки 
        /// </summary>
        /// <param name="data"></param>
        public abstract void LoadData(IDataLoader data);

        /// <summary>
        /// Выгружает результаты сегментации
        /// </summary>
        public abstract CalculatorResults UpLoadData();

        /// <summary>
        /// Сегментирует выбранную знаковую последовательность с учетом принятых параметров
        /// </summary>
        public abstract void Slot();



    }
    /// <summary>
    /// Входные данные
    /// </summary>
    class InputData
    {
        public string Sequence { get; set; }// Знаковая последовательность
        
        public string ChainName { get; set; }// Название символьной последовательности

        public bool IsSavingResults { get; set; }//Флаг сохранения результатов

        public int AmountStartAlgorithm { get; set; }// Число запусков алгоритма

        public double ThresholdLeft { get; set; } // Левый порог, из которого принимается решение на принятие, выполнение каких-либо действий

        public double ThresholdRight { get; set; } // Левый порог, из которого принимается решение на принятие, выполнение каких-либо действий

        public double ThresholdStep { get; set; } // Шаг изменения порога

        public double BalanceFactor { get; set; } // Баланс между двумя величинами(обычно измеряется от 0 до 100)

        public int LengthStartWindow { get; set; }//Начальная длина окна сканирования

        public double Precision { get; set; }// Точность расчета какой-либо величины

        public double MinAlphabetsDistortion { get; set; } // минимальное расхождение объемов алфавитов(в качестве критерия остановки сегментации и тд)

    }
}
